package com.work.service.main;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.work.dto.main.ShipBillStorageSearchDTO;
import com.work.entity.main.ShipBillStorage;
import com.work.vo.main.*;
import org.springblade.core.mp.base.BaseService;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

/**
 * 场存接口
 *
 * @author ：dujianyu
 * @since ：Created in 2024/3/14 9:57
 */
@Validated
public interface IShipBillStorageService extends BaseService<ShipBillStorage> {

    /**
     * 添加新场存记录并返回场存主键ID
     * @param entity 数据
     * @return Long
     * @author dujianyu
     * @since 2024/3/14 10:07
     */
    Long addNewShipStorage(ShipBillStorage entity);

    /**
     * 增加场存
     * @param storageId 场存主键
     * @param piece 增加件数
     * @param ton 增加吨数
     * @return boolean
     * @author dujianyu
     * @since 2024/3/14 10:16
     */
    boolean addStorageWithGoodPositionId(@NotNull Long storageId, @NotNull  Integer piece, @NotNull  BigDecimal ton, Long goodsPositionId);

    /**
     * 增加场存
     * @param storageId 场存主键
     * @param piece 增加件数
     * @param ton 增加吨数
     * @return boolean
     * @author dujianyu
     * @since 2024/3/14 10:16
     */
    boolean addStorage(@NotNull Long storageId,@NotNull  Integer piece,@NotNull  BigDecimal ton);

    /**
     * 减少场存
     * @param storageId 场存主键
     * @param piece 减少件数
     * @param ton 减少吨数
     * @return boolean
     * @author dujianyu
     * @since 2024/3/14 10:16
     */
    boolean subStorageWithGoodPositionId(@NotNull Long storageId, @NotNull Integer piece, @NotNull BigDecimal ton, Long goodsPositionId);

    /**
     * 减少场存
     * @param storageId 场存主键
     * @param piece 减少件数
     * @param ton 减少吨数
     * @return boolean
     * @author dujianyu
     * @since 2024/3/14 10:16
     */
    boolean subStorage(@NotNull Long storageId,@NotNull Integer piece,@NotNull BigDecimal ton);

    /**
     * 根据货运舱单ID获取库存
     * @param dto 搜索条件
     * @return PieceTonVO
     * @author dujianyu
     * @since 2024/3/21 14:54
     */
    PieceTonVO getStorageByTransportBillId(ShipBillStorageSearchDTO dto);

    /**
     * 分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<ShipBillStorageVO>
     * @author dujianyu
     * @since 2024/3/26 8:56
     */
    IPage<ShipBillStorageVO> selectShipBillStoragePage(IPage<ShipBillStorageVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 列表
     * @param dto 搜索条件
     * @return List<ShipBillStorageVO>
     * @author dujianyu
     * @since 2024/3/26 9:20
     */
    List<ShipBillStorageVO> selectShipBillStorageList(ShipBillStorageSearchDTO dto);

    /**
     * 合计
     * @param dto 搜索条件
     * @return PieceTonVO
     * @author dujianyu
     * @since 2024/7/16 14:48
     */
    PieceTonVO selectShipBillStorageTotal(ShipBillStorageSearchDTO dto);

    /** 
     * 详情
     * @param dto 搜索参数
     * @return ShipBillStorageVO
     * @author dujianyu
     * @since 2024/3/27 10:31
     */ 
    ShipBillStorageVO getStorageDetail(ShipBillStorageSearchDTO dto);

    /**
     * 清空货垛
     * @param transportBillId 舱单ID
     * @return boolean
     * @author dujianyu
     * @since 2024/6/27 10:17
     */
    boolean clearStorage(String transportBillId);

    /**
     * 货物库存汇总统计-货场分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByPositionVO>
     * @author dujianyu
     * @since 2024/7/4 11:05
     */
    IPage<StorageByPositionVO> selectStorageByPositionPage(IPage<StorageByPositionVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货场统计
     * @param dto 搜索条件
     * @return PieceTonVO
     * @author dujianyu
     * @since 2024/7/4 11:10
     */
    PieceTonVO selectStorageByPositionTotal(ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货名统计
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByCargoVO>
     * @author dujianyu
     * @since 2024/7/4 14:35
     */
    IPage<StorageByCargoVO> selectStorageByCargoPage(IPage<StorageByCargoVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货名统计
     * @param dto 搜索条件
     * @return PieceTonVO
     * @author dujianyu
     * @since 2024/7/4 14:40
     */
    PieceTonVO selectStorageByCargoTotal(ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-船名
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByShipVO>
     * @author dujianyu
     * @since 2024/7/4 15:14
     */
    IPage<StorageByShipVO> selectStorageByShipPage(IPage<StorageByShipVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-船名统计
     * @param dto 搜索条件
     * @return PieceTonVO
     * @author dujianyu
     * @since 2024/7/4 15:18
     */
    PieceTonVO selectStorageByShipTotal(ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货场详情分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByPositionDetailVO>
     * @author dujianyu
     * @since 2024/7/8 8:46
     */
    IPage<StorageByPositionDetailVO> selectStorageByPositionDetailPage(IPage<StorageByPositionDetailVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货场理货分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByPositionTallyVO>
     * @author dujianyu
     * @since 2024/7/8 11:02
     */
    IPage<StorageByPositionTallyVO> selectStorageByPositionTallyPage(IPage<StorageByPositionTallyVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-货名详情分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByCargoDetailVO>
     * @author dujianyu
     * @since 2024/7/8 14:00
     */
    IPage<StorageByCargoDetailVO> selectStorageByCargoDetailPage(IPage<StorageByCargoDetailVO> page, ShipBillStorageSearchDTO dto);

    /**
     * 货物库存汇总统计-船名详情分页
     * @param page 分页
     * @param dto 搜索条件
     * @return IPage<StorageByShipDetailVO>
     * @author dujianyu
     * @since 2024/7/8 15:10
     */
    IPage<StorageByShipDetailVO> selectStorageByShipDetailPage(IPage<StorageByShipDetailVO> page, ShipBillStorageSearchDTO dto);
}
